package model

import (
	"encoding/json"
	"fmt"
	"net/http"
	"service/conf"

	"gitee.com/cloudapex/ulern/htp"
)

type WxFrame struct {
	Id       int64  `json:"id"`       //部门id，32位整型，指定时必须大于1。若不填该参数，将自动生成id
	Name     string `json:"name"`     //部门名称。同一个层级的部门名称不能重复。长度限制为1~32个字符，字符不能包括\:?”<>｜
	ParentId int64  `json:"parentid"` //父部门id，
	Order    int64  `json:"order"`    //在父部门中的次序值。order值大的排序靠前。有效的值范围是[0, 2^32)
	NameEn   string `json:"name_en"`
}

type ResInfo struct {
	ErrCode int64  `json:"errcode"`
	ErrMsg  string `json:"errmsg"`
	Id      int64  `json:"id"`
}

type WxFrameList struct {
	WxList  []WxFrame `json:"department"`
	ErrCode int64     `json:"errcode"`
	ErrMsg  string    `json:"errmsg"`
}

/**
 * 请求方式：POST（HTTPS）
 * 请求地址：https://qyapi.weixin.qq.com/cgi-bin/department/create?access_token=ACCESS_TOKEN
 * 请求包体：
 */
func (this *WxFrame) AddFram() (wx WxFrame, err error) {
	token, err := conf.Wechat.GetAccessToken()
	if err != nil {
		err = err
		return
	}

	//添加组织架构
	url := "https://qyapi.weixin.qq.com/cgi-bin/department/create?access_token=" + token
	strPara := fmt.Sprintf("department=%s&name=%s&parentid=%d", "部门添加1", this.Name, this.ParentId)
	fmt.Println("添加参数：", strPara)
	rsp, err := htp.HttpRequest("POST", url, strPara, func(h http.Header) { h.Add("Content-Type", "application/json") })
	if err != nil {
		return WxFrame{}, err
	}

	var res ResInfo
	json.Unmarshal(rsp.Body, &res)

	if res.ErrCode == 0 {
		fmt.Println("添加架构成功:", res.Id)
	} else {
		fmt.Println("添加架构失败:", res.ErrMsg)
	}

	this.Id = res.Id
	wxList, err := this.GetFramList()

	var wxRes WxFrame
	if len(wxList) > 0 {
		wxRes = wxList[0]
	}
	return wxRes, err
}

/**
 * 请求方式：GET（HTTPS）
 * 请求地址：https://qyapi.weixin.qq.com/cgi-bin/department/delete?access_token=ACCESS_TOKEN&id=ID
 * 参数说明 ：id  部门id。（注：不能删除根部门；不能删除含有子部门、成员的部门）
 */
func (this *WxFrame) DelFram() (id int64, err error) {
	token, err := conf.Wechat.GetAccessToken()
	if err != nil {
		err = err
		return
	}
	//删除组织架构
	url := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/department/delete?access_token=%s&id=%d", token, this.Id)
	rsp, err := htp.HttpRequest("GET", url, "", nil)
	if err != nil {
		return 0, err
	}
	var res ResInfo
	json.Unmarshal(rsp.Body, &res)

	if res.ErrCode == 0 {
		fmt.Println("删除架构成功:", res.Id)
	} else {
		fmt.Println("删除架构失败:", res.ErrMsg)
	}
	return res.Id, err
}

/**
 *  请求方式：POST（HTTPS）
 *  请求地址：https://qyapi.weixin.qq.com/cgi-bin/department/update?access_token=ACCESS_TOKEN
 *  请求包体（如果非必须的字段未指定，则不更新该字段）：
 */
func (this *WxFrame) UpdateFram() error {
	token, err := conf.Wechat.GetAccessToken()
	if err != nil {
		return err
	}
	//更新组织架构
	url := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/department/update?access_token=%s", token)
	strPara := fmt.Sprintf("id=%d&name=%s", this.Id, this.Name)
	rsp, err := htp.HttpRequest("POST", url, strPara, func(h http.Header) { h.Add("Content-Type", "application/json") })
	if err != nil {
		return err
	}

	var res ResInfo
	json.Unmarshal(rsp.Body, &res)

	if res.ErrCode == 0 {
		fmt.Println("更新架构成功:", res.Id)
	} else {
		fmt.Println("更新架构失败:", res.ErrMsg)
	}
	return err
}

/**
 *  请求方式 GET
 *  access_token	是	调用接口凭证
 *  id	否	部门id。获取指定部门及其下的子部门（以及及子部门的子部门等等，递归）。 如果不填，默认获取全量组织架构
 */
func (this *WxFrame) GetFramList() (wxList []WxFrame, err error) {
	token, err := conf.Wechat.GetAccessToken()
	if err != nil {
		err = err
		return
	}
	//获取组织架构列表
	var url string
	if this.Id == 0 {
		url = fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token=%s", token)
	} else {
		url = fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token=%s&id=%d", token, this.Id)
	}

	fmt.Println("url:", url)
	rsp, err := htp.HttpRequest("GET", url, "", nil)
	if err != nil {
		return nil, err
	}

	var list WxFrameList
	json.Unmarshal(rsp.Body, &list.WxList)

	if list.ErrCode == 0 {
		fmt.Println("获取架构成功:", len(list.WxList))
	} else {
		fmt.Println("获取架构失败:", list.ErrMsg)
	}
	return list.WxList, err
}
